/** 统一开启一个计时器来处理需要计时器的方法 */
import unique from "./unique";

const pool = {};
// 计时器执行间隔时间
let INTERVAL = 16;
let timer;
function interval() {
  for (const key in pool) {
    const item = pool[key];
    try {
      if (item())
        clear(key);
    } catch (err) {
      console.error("timer function error", item, err);
      clear(key);
    }
  }
}
function isEmpty(obj) {
  for (const key in obj)
    return false;
  return true;
}
/** @param {number} interval - 计时器间隔时间，单位毫秒 */
export function setTime(interval) {
  INTERVAL = interval;
  if (timer) {
    clearInterval(timer);
    timer = setInterval(interval, INTERVAL);
  }
}
/** 加入一个需要定时调用的方法
 * @param {function()} func 调用的方法返回非空对象则代表方法结束
 * @returns {number} 返回方法在计时器中的key，可用于clear方法
 */
export function set(func) {
  if (!func)
    throw "timer set function can't not be null"
  const key = unique();
  pool[key] = func;
  if (!timer)
    timer = setInterval(interval, INTERVAL);
  return key;
}
/** 清除一个定时调用的方法
 * @param {number} key 由set方法返回
 */
export function clear(key) {
  delete pool[key];
  if (timer && isEmpty(pool)) {
    clearInterval(timer);
    timer = undefined;
  }
}
export default /** 全局计时器 */{
  setTime,
  set,
  clear,
}